package cn.edu.fzu.delivery.service;

import cn.edu.fzu.delivery.domain.entity.Customer;
import cn.edu.fzu.delivery.domain.entity.SysUser;
import cn.edu.fzu.delivery.domain.enums.SexEnum;
import cn.edu.fzu.delivery.domain.enums.UserStatusEnum;
import cn.edu.fzu.delivery.domain.enums.UserTypeEnum;

import java.util.Date;
import java.util.List;

/**
 * @author fangxin
 * @date 2022/9/10
 */
public interface UserService {

    /**
     * 查询系统人员：快递员，网点管理员，超级管理员
     *
     * @param networkId 网点id
     * @param name 用户姓名
     * @param type 用户类型
     * @param status 用户状态
     * @param phone 用户手机号
     * @param email 用户邮箱
     * @return
     */
    List<SysUser> listSysUser(Long networkId, String name, UserTypeEnum type, UserStatusEnum status, String phone,
                              String email, SysUser currentUser);


    /**
     * 通过邮箱获取系统人员：快递员，网点管理员，超级管理员
     *
     * @param email
     * @return
     */
    SysUser getSysUserByEmail(String email);


    /**
     * 通过手机号查询系统人员
     *
     * @param phone
     * @return
     */
    SysUser getSysUserByPhone(String phone);


    /**
     * 通过钉钉id查询该用户
     *
     * @param dingId
     * @return
     */
    SysUser getSysUserByDingId(String dingId);


    /**
     * 更新用户基本信息
     *
     * @param id          id
     * @param email       邮箱
     * @param name        名称
     * @param sex         性别
     * @param birth       生日
     * @param phone       电话
     * @param address     地址
     * @param type        类型
     * @param status      状态
     * @param networkId   网点id
     * @param currentUser 当前用户
     * @return
     */
    void updateSysUserInfo(Long id, String email, String name, SexEnum sex, Date birth, String phone, String address,
                           UserTypeEnum type, UserStatusEnum status, Long networkId,
                           SysUser currentUser);


    /**
     * 添加系统人员
     *
     * @param email 邮箱
     * @param name 名称
     * @param sex 性别
     * @param birth 生日
     * @param phone 电话
     * @param address 地址
     * @param type 类型
     * @param networkId 网点id
     * @param currentUser 当前用户
     * @return
     */
    void addSysUser(String email, String name, SexEnum sex, Date birth, String phone, String address, UserTypeEnum type,
                    Long networkId, SysUser currentUser);


    /**
     * 更新系统用户状态
     *
     * @param id id
     * @param status 状态
     * @param currentUser 当前用户
     * @return
     */
    void updateSysUserStatus(Long id, UserStatusEnum status, SysUser currentUser);


    /**
     * 绑定钉钉和系统人员
     *
     * @param email
     * @param dingId
     */
    void updateSysUserDingId(String email, String dingId);


    /**
     * 通过手机号查询顾客
     *
     * @param phone 手机号
     * @return
     */
    Customer getCustomerByPhone(String phone);


    /**
     * 通过邮箱查询顾客
     *
     * @param email
     * @return
     */
    Customer getCustomerByEmail(String email);


    /**
     * 添加顾客
     *
     * @param email 邮箱
     * @param password 密码
     * @param name 姓名
     * @param sex 性别
     * @param birth 出生日期
     * @param phone 电话
     * @param imageUrl 照片
     */
    void addCustomer(String email, String password, String name, SexEnum sex, String birth, String phone,
                     String imageUrl);


    /**
     * 修改顾客信息
     *
     * @param id
     * @param name
     * @param sex
     * @param birth
     * @param imageUrl
     */
    void updateCustomer(Long id, String name, SexEnum sex, String birth, String imageUrl);


    /**
     * 顾客修改密码
     *
     * @param email 邮箱
     * @param password 密码
     */
    void updateCustomerPassword(String email, String password);


    /**
     * 系统用户修改密码
     *
     * @param email 邮箱
     * @param password 密码
     */
    void updateSysPassword(String email, String password);

    /**
     * 查询顾客列表
     *
     * @param name        姓名
     * @param email       邮箱
     * @param sex         性别
     * @param phone       电话
     * @param status      状态
     * @param currentUser 当前用户
     */
    List<Customer> listCustomer(String name, String email, SexEnum sex, String phone, UserStatusEnum status, SysUser currentUser);

    /**
     * 修改顾客状态
     * @param id id
     * @param status 状态
     * @param currentUser 当前用户
     */
    void updateCustomerStatus(Long id, UserStatusEnum status, SysUser currentUser);

    /**
     * 修改头像
     * @param imageUrl 头像url
     * @param currentUser 当前用户
     */
    void updateImageUrl(String imageUrl, Object currentUser);
}
